{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true,
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "11.999999999972033\n",
      "0.1999999999990898\n",
      "0.2999999999986347\n"
     ]
    }
   ],
   "source": [
    "# 数值微分实现\n",
    "# 使用数值方法近似求解函数导数的过程\n",
    "\n",
    "def numerical_diff(f, x):\n",
    "    h = 1e-4\n",
    "    return (f(x + h) - f(x - h)) / (2 * h)\n",
    "\n",
    "# 示例1\n",
    "def square_function(x):\n",
    "    return x ** 2\n",
    "print(numerical_diff(square_function, 6))\n",
    "\n",
    "# 示例2\n",
    "def function_2(x):\n",
    "    return 0.01 * x ** 2 + 0.1 * x\n",
    "print(numerical_diff(function_2, 5))\n",
    "print(numerical_diff(function_2, 10))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.2999999999986347\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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fbonioiIeCxLv3567LHHuP3228+4Tf369c/5+YOCgggKCjrnx5dYYIj5IyIiIpaxtNTExMQQExNjZQQRERHxEV5zonBycjInTpwgOTkZl8vFhg0bAGjYsCHVqlWzNpyIiIhYzmtKzXPPPceUKVOKxu3atQNgwYIFXHzxxRalEhEREU9hMwzDsDpERXE4HISHh5ORkUFYWJjVcURERKQESvr5rUt1RERExCeo1IiIiIhPUKkRERERn6BSIyIiIj5BpUZERER8gkqNiIiI+ASVGhEREfEJKjUiIiLiE1RqRERExCd4zTIJZeGPyZMdDofFSURERKSk/vjcPtsiCJWq1GRmZgKQmJhocRIREREprczMTMLDw4u9v1Kt/eR2uzl48CChoaHYbLYye16Hw0FiYiIpKSk+u6aU3qP38/X3B3qPvsDX3x/4/nssj/dnGAaZmZkkJCRgtxd/5kylOlJjt9upVatWuT1/WFiYT/6C/pneo/fz9fcHeo++wNffH/j+eyzr93emIzR/0InCIiIi4hNUakRERMQnqNSUgaCgIEaMGEFQUJDVUcqN3qP38/X3B3qPvsDX3x/4/nu08v1VqhOFRURExHfpSI2IiIj4BJUaERER8QkqNSIiIuITVGpERETEJ6jUlNDYsWOpW7cuwcHBdOnShdWrV59x+6+//pqmTZsSHBxMq1at+OmnnyooaemNHDmSTp06ERoaSmxsLFdddRU7duw442MmT56MzWY75Sc4OLiCEpfe888//7e8TZs2PeNjvGkf1q1b92/vz2azMWzYsNNu7w37b/HixQwYMICEhARsNhvffffdKfcbhsFzzz1HjRo1qFKlCr1792bnzp1nfd7S/i2XpzO9x4KCAp566ilatWpF1apVSUhI4NZbb+XgwYNnfM5z+V0vL2fbh7fffvvfsvbr1++sz+st+xA47d+lzWZj1KhRxT6nJ+3Dknw+5OXlMWzYMKKioqhWrRqDBw/m8OHDZ3zec/37PRuVmhL48ssvefTRRxkxYgTr1q2jTZs29O3blyNHjpx2++XLl3PjjTcydOhQ1q9fz1VXXcVVV13Fli1bKjh5ySxatIhhw4axcuVK5s6dS0FBAX369CE7O/uMjwsLC+PQoUNFP/v376+gxOemRYsWp+RdunRpsdt62z5cs2bNKe9t7ty5AFx77bXFPsbT9192djZt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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘制函数图形\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "\n",
    "def tangent_line(f, x):\n",
    "    d = numerical_diff(f, x)\n",
    "    print(d)\n",
    "    y = f(x) - d*x\n",
    "    return lambda t: d*t + y\n",
    "\n",
    "x = np.arange(0.0, 20.0, 0.1)\n",
    "y = function_2(x)\n",
    "tf = tangent_line(function_2, 10.0)\n",
    "y2 = tf(x)\n",
    "plt.xlabel(\"x\")\n",
    "plt.ylabel(\"f(x)\")\n",
    "plt.plot(x, y)\n",
    "plt.plot(x, y2)\n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5.0\n"
     ]
    }
   ],
   "source": [
    "# 偏导数计算\n",
    "\n",
    "import numpy as np\n",
    "\n",
    "def function_2(x):\n",
    "    return np.sum(x ** 2)\n",
    "\n",
    "x = np.array([1.0, 2.0])\n",
    "print(function_2(x))"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}